/**
 * 
 */
package com.dingding.service.activity.core.dao.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.dingding.common.core.base.dao.impl.BaseDaoImpl;
import com.dingding.common.core.base.daox.ISQLBaseDao;
import com.dingding.common.core.beans.ActivityRelevance;
import com.dingding.common.core.beans.UserCoupon;
import com.dingding.common.core.util.DateFormatUtil;
import com.dingding.common.core.util.ToolUtil;
import com.dingding.facde.activity.dto.ExpiredCouponDTO;
import com.dingding.facde.activity.dto.ShowUserCouponDTO;
import com.dingding.facde.activity.dto.ShowUserCouponListDTO;
import com.dingding.facde.activity.dto.UserCouponInfoDTO;
import com.dingding.facde.activity.dto.sql.UserCouponSQL;
import com.dingding.service.activity.core.dao.IUserCouponDao;

/**
 * @ClassName: UserCouponDaoImpl
 * @Description:用户优惠券dao实现
 * @author zhouxuan
 * @date 2016年3月31日 上午11:43:28
 */
@Component("userCouponDao")
public class UserCouponDaoImpl extends BaseDaoImpl<UserCoupon> implements IUserCouponDao {
	private Logger log = Logger.getLogger(this.getClass());

	@Resource(name = "SQLBaseDao")
	private ISQLBaseDao sqlBaseDao;
	
	/**
	 * 
	 * @Title: getCouponList 
	 * @Description: 根据用户ID获取当前用户的所有优惠券 
	 * @param userId 用户ID
	 * @return List<ShowUserCouponDTO> 当前用户的优惠券集合
	 * @author CHEHAUNBO
	 * 
	 */
	@Override
	@Transactional(readOnly = true)
	public List<ShowUserCouponDTO> getUserCouponList(String userId) {

		List<Object[]> objects = new ArrayList<Object[]>();

		try {
			objects = super.listSqlObj(UserCouponSQL.GET_USER_COUPON_SQL, userId);
		} catch (Exception e) {
			log.error("根据用户ID获取所有优惠券出现异常！", e);
		}

		return getUserCouponListConverBean(objects);

	}

	/**
	 * 
	 * @Title: getUserCoupons 
	 * @Description: 根据用户ID获取当前用户的所有优惠券 
	 * @param userId 用户ID
	 * @return List<ShowUserCouponDTO> 当前用户的优惠券集合
	 * @author CHEHAUNBO
	 * 
	 */
	@Override
	@Transactional(readOnly = true)
	public List<ShowUserCouponListDTO> getUserCoupons(String userId) {

		try {
			return sqlBaseDao.listSqlToCustomBean(ShowUserCouponListDTO.class,UserCouponSQL.GET_USER_COUPON_LIST_SQL, userId);
		} catch (Exception e) {
			log.error("根据用户ID获取所有优惠券出现异常！", e);
		}

		return null;

	}
	
	/**
	 * 
	 * @Title: getUserCouponListConverBean 
	 * @Description: 获取用户优惠券数据数据转换
	 * @param objects 原生优惠券数据集合
	 * @return List<ShowUserCouponDTO>  转换后的数据集合
	 * @author CHEHAUNBO
	 * 
	 */
	private List<ShowUserCouponDTO> getUserCouponListConverBean(List<Object[]> objects) {

		List<ShowUserCouponDTO> showUserCouponDTOs = new ArrayList<ShowUserCouponDTO>();

		for (Object[] obj : objects) {

			ShowUserCouponDTO showUserCouponDTO = new ShowUserCouponDTO();
			// 优惠券ID
			if (obj[0] != null) {
				showUserCouponDTO.setUserCouponId(obj[0].toString());
			}
			// 优惠券状态
			if (obj[1] != null) {
				showUserCouponDTO.setCouponStatus(ToolUtil.castInteger(obj[1]));
			}
			// 有效期
			if (obj[2] != null) {
				
				showUserCouponDTO.setExpiredTime(obj[2].toString());
				
				// 如果有效日期小于当前时间，则订单过期
				if(DateFormatUtil.compareDate(DateFormatUtil.yyyy_MM_dd_HHmmss(obj[2].toString()), new Date()) < 0){
					showUserCouponDTO.setCouponStatus(4);
				}
				
			}
			// 优惠券类型
			if (obj[3] != null) {
				showUserCouponDTO.setCouponType(ToolUtil.castInteger(obj[3].toString()));
			}
			// 优惠金额
			if (obj[4] != null) {
				showUserCouponDTO.setCouponMoney(ToolUtil.castDouble(obj[4].toString()));
			}
			// 优惠金额
			if (obj[5] != null) {
				showUserCouponDTO.setUsageRule(obj[5].toString());
			}

			showUserCouponDTOs.add(showUserCouponDTO);

		}

		return showUserCouponDTOs;

	}
public static void main(String[] args) {
	System.out.println();
}
	/**
	 * 
	 * @Title: getUserCouponInfo 
	 * @Description: 根据用户ID获取优惠券详细信息
	 * 主要包括：规则、有效期、金额
	 * @param userCouponId 用户优惠券ID
	 * @return UserCouponInfoDTO 用户详情
	 * @author CHEHAUNBO
	 * 
	 */
	@Override
	@Transactional(readOnly = true)
	public UserCouponInfoDTO getUserCouponInfo(String userCouponId) {

		Object[] obj = null;
		UserCouponInfoDTO couponInfoDTO = null;

		try {
			obj = super.sqlQueryUnResultObj(UserCouponSQL.GET_USER_COUPONINFO_SQL, userCouponId);
			couponInfoDTO = getUserCouponInfoConvertBean(obj);
		} catch (Exception e) {
			log.error("根据用户ID获取所有优惠券出现异常！", e);
		}

		return couponInfoDTO;
	}

	/**
	 * 
	 * @Title: ConvertBean 
	 * @Description: 获取优惠券详细信息数据转换bean
	 * @param Object[] obj 原生数据
	 * @return UserCouponInfoDTO 转换后的DTO
	 * @author CHEHAUNBO
	 * 
	 */
	private UserCouponInfoDTO getUserCouponInfoConvertBean(Object[] obj) {

		UserCouponInfoDTO userCouponInfoDTO = new UserCouponInfoDTO();

		if (obj != null) {
			if (obj[0] != null) { // 用户优惠券主键ID
				userCouponInfoDTO.setUcId(obj[0].toString());
			}
			if (obj[1] != null) { // 优惠金额
				userCouponInfoDTO.setCouponMoney(Double.valueOf(obj[0].toString()));
			}
			if (obj[2] != null) { // 有效期
				userCouponInfoDTO.setExpiredTime(obj[1].toString());
			}
		}
		return userCouponInfoDTO;

	}

	/**
	 * 
	 * @Title: activateCoupon 
	 * @Description: APP端激活优惠券
	 * @param userCouponId 用户优惠券主键ID
	 * @return boolean  true 激活成功  false 激活失败
	 * @author CHEHAUNBO
	 * 
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public boolean activateCoupon(String userCouponId) {

		int excuteRow = super.updateSqlRow(UserCouponSQL.AVTIVITE_COUPON_SQL, userCouponId);

		// 激活成功
		if (excuteRow != 0) {
			return true;
		}
		return false;

	}

	/**
	 * @Title: useCoupon
	 * @Description: 使用优惠券
	 * @param couponId 优惠券id
	 * @param userId 扫码人Id
	 * @author fengshuonan
	 * @return true 使用成功  false 使用失败
	 * @throws
	 */
	@Transactional(propagation = Propagation.REQUIRED)
	public boolean useCoupon(String couponId, String userId) {

		UserCoupon userCoupon = null;
		try {
			userCoupon = super.getById(couponId);
		} catch (Exception e) {
			log.error("使用优惠券时出现异常   类：" + this.getClass() + " useCoupon()", e);
		}

		if (userCoupon == null) {
			return false;
		}

		// 如果优惠券不是已激活状态则不可使用
		if (userCoupon.getCouponStatus() != 2) {
			return false;
		}

		// 设置优惠券状态为已使用
		userCoupon.setCouponStatus(3);
		// 扫描人
		userCoupon.setShopAst(userId);
		// 优惠券使用时间
		userCoupon.setConsumeTime(new Date());

		return true;
	}

	/**
	 * 
	 * @Title: addUserCoupon 
	 * @Description: 添加用户优惠券
	 * @author CHEHAUNBO
	 * 
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public boolean addUserCoupon(String userId) {

		UserCoupon userCoupon = new UserCoupon();
		userCoupon.setUcId(ToolUtil.getUid()); // 优惠券ID
		userCoupon.setLoginId(userId); // 用户ID
		userCoupon.setCouponId(1); // 出行券
		userCoupon.setCouponMoney(2); // 优惠金额
		userCoupon.setCreateTime(new Date());
		userCoupon.setCouponType(2);
		userCoupon.setExpiredTime(DateFormatUtil.yyyy_MM_dd_HHmmss("2016-07-31 00:00:00"));
		userCoupon.setCouponStatus(1); // 优惠券状态（未激活）

		UserCoupon userCoupon2 = new UserCoupon();
		userCoupon2.setUcId(ToolUtil.getUid()); // 优惠券ID
		userCoupon2.setLoginId(userId); // 用户ID
		userCoupon2.setCouponId(2); // 洗车券
		userCoupon2.setCouponType(1);
		userCoupon2.setCouponMoney(2); // 优惠金额
		userCoupon2.setCreateTime(new Date());
		userCoupon2.setExpiredTime(DateFormatUtil.yyyy_MM_dd_HHmmss("2016-07-31 00:00:00"));
		userCoupon2.setCouponStatus(1); // 优惠券状态(未激活)

		try {
			super.save(userCoupon);
			super.save(userCoupon2);
			return true;
		} catch (Exception e) {
			log.error("添加用户优惠券出现异常！", e);
		}

		return false;
	}
	
	/**
	 * @Description: 添加洗车券和现金券
	 * @param userId 用户id
	 * @param isActive 是否激活（true要激活  ，false 不要激活）
	 * @author fengshuonan
	 * @return void
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public boolean addCarWashCouponAndMoneyCoupon(String userId,boolean isActive){
		UserCoupon userCoupon = new UserCoupon();
		userCoupon.setUcId(ToolUtil.getUid()); // 优惠券ID
		userCoupon.setLoginId(userId); // 用户ID
		userCoupon.setCouponId(1); // 出行券
		userCoupon.setCouponMoney(2); // 优惠金额
		userCoupon.setCreateTime(new Date());
		userCoupon.setCouponType(2);
		userCoupon.setExpiredTime(DateFormatUtil.yyyy_MM_dd_HHmmss("2016-07-31 00:00:00"));

		UserCoupon userCoupon2 = new UserCoupon();
		userCoupon2.setUcId(ToolUtil.getUid()); // 优惠券ID
		userCoupon2.setLoginId(userId); // 用户ID
		userCoupon2.setCouponId(2); // 洗车券
		userCoupon2.setCouponType(1);
		userCoupon2.setCouponMoney(0); // 优惠金额
		userCoupon2.setCreateTime(new Date());
		userCoupon2.setExpiredTime(DateFormatUtil.yyyy_MM_dd_HHmmss("2016-07-31 00:00:00"));
		
		if(isActive){
			userCoupon.setCouponStatus(2); // 优惠券状态（激活）
			userCoupon2.setCouponStatus(2); // 优惠券状态(激活)
		}else{
			userCoupon.setCouponStatus(1); // 优惠券状态（未激活）
			userCoupon2.setCouponStatus(1); // 优惠券状态(未激活)
		}

		try {
			super.save(userCoupon);
			super.save(userCoupon2);
			return true;
		} catch (Exception e) {
			log.error("添加用户优惠券出现异常！", e);
		}

		return false;
	}
	

	/**
	 * 
	 * @Title: generateRandomMoney 
	 * @Description:生成优惠券金额
	 * @return double  优惠券金额
	 * @author CHEHAUNBO
	 * 
	 */
	private BigDecimal generateRandomMoney() {

		Random rand = new Random();
		int money = rand.nextInt(5);
		if (money == 0) {
			money += 1;
		}

		return new BigDecimal(2);
	}

	/**
	 * @Description: 激活所有未激活的优惠券
	 * @param tellPhone 用户账号
	 * @author fengshuonan
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public boolean weChatActivationCoupon(String tellPhone) {

		try {
			super.updateSqlRow(UserCouponSQL.WECHAT_AVTIVITE_ALL_COUPON_SQL, tellPhone);
		} catch (Exception e) {
			log.error("微信端激活优惠券出现异常！", e);
			return false;
		}

		return true;
	}

	/**
	 * @Title: addCoupon
	 * @Description: 添加用户优惠券
	 * @param @param
	 *            userCoupon
	 * @author zhouxuan
	 * @return boolean
	 */
	@Transactional(propagation = Propagation.REQUIRED)
	public boolean addCoupon(UserCoupon userCoupon) {
		try {
			this.save(userCoupon);
		} catch (Exception e) {
			log.error("添加用户优惠券失败！UserCouponDaoImpl:addCoupon()", e);
			return false;
		}
		return true;
	}
	
	/**
	 * 
	 * @Title: addUserCoupon 
	 * @Description: 添加用户优惠券
	 * @author CHEHAUNBO
	 * 
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public boolean addUserCouponInfo(String userId) {

		UserCoupon userCoupon = new UserCoupon();
		userCoupon.setUcId(ToolUtil.getUid()); // 优惠券ID
		userCoupon.setLoginId(userId); // 用户ID
		userCoupon.setCouponId(1); // 出行券
		userCoupon.setCouponMoney(10); // 优惠金额
		userCoupon.setCreateTime(new Date());
		userCoupon.setExpiredTime(DateFormatUtil.yyyy_MM_dd_HHmmss("2016-07-31 00:00:00"));
		userCoupon.setCouponStatus(1); // 优惠券状态

		try {
			super.save(userCoupon);
			return true;
		} catch (Exception e) {
			log.error("添加用户优惠券出现异常！", e);
		}

		return false;
	}

	/**
	 * @Title: addTwoCoupon 
	 * @Description: 兑换邀请码添加两张优惠券
	 * @param object 赠送的优惠券信息
	 * @author YHQ 
	 * @return boolean    返回类型
	 */
	@Override
	@Transactional(propagation=Propagation.REQUIRED)
	public boolean addTwoCoupon(Object[] object,ActivityRelevance activityRelevance1,ActivityRelevance activityRelevance2,String userId) {
		
		if(object[0] == null
				|| object[1] == null
				|| object[2] == null){
			
			return false;
		}
		
		//给使用邀请码的人添加优惠券
		UserCoupon userCoupon = new UserCoupon();
		
		if(activityRelevance1 != null && activityRelevance1.getIsAttendActivity() == 1){
			
			userCoupon.setUcId(ToolUtil.getUid()); // 优惠券ID
			userCoupon.setLoginId(activityRelevance1.getUserId()); // 用户ID
			userCoupon.setCouponId(Integer.parseInt(object[0].toString())); //优惠券Id
			userCoupon.setCouponType(ToolUtil.castInteger(object[1]));//优惠券类型
			userCoupon.setCouponMoney(Integer.parseInt(object[2].toString())); // 优惠金额
			userCoupon.setCreateTime(new Date());
			userCoupon.setExpiredTime(DateFormatUtil.yyyy_MM_dd_HHmmss("2016-07-31 00:00:00"));
			userCoupon.setCouponStatus(2); // 优惠券状态 1：未激活 2：已激活 3：已使用 4：禁止使用  说明：  未激活状态为该优惠券需要用户分享app到朋友圈才可以用
		}
		
		//给使用邀请码的人添加优惠券
		UserCoupon userCoupon2 = new UserCoupon();
		
		if(activityRelevance2 == null || (activityRelevance2 != null && activityRelevance2.getIsAttendActivity() == 1)){
			userCoupon2.setUcId(ToolUtil.getUid()); // 优惠券ID
			userCoupon2.setLoginId(userId); // 用户ID
			userCoupon2.setCouponId(Integer.parseInt(object[0].toString())); //优惠券Id
			userCoupon2.setCouponType(ToolUtil.castInteger(object[1]));//优惠券类型
			userCoupon2.setCouponMoney(Integer.parseInt(object[2].toString())); // 优惠金额
			userCoupon2.setCreateTime(new Date());
			userCoupon2.setExpiredTime(DateFormatUtil.yyyy_MM_dd_HHmmss("2016-07-31 00:00:00"));
			userCoupon2.setCouponStatus(2); // 优惠券状态 1：未激活 2：已激活 3：已使用 4：禁止使用  说明：  未激活状态为该优惠券需要用户分享app到朋友圈才可以用
		}
		
		try {
			
			//要添加的优惠券信息不为空，则添加
			if(userCoupon != null && ToolUtil.isNotBlank(userCoupon.getUcId())){
				super.save(userCoupon);
			}
			
			//要添加的优惠券信息不为空，则添加
			if(userCoupon2 != null && ToolUtil.isNotBlank(userCoupon2.getUcId())){
				super.save(userCoupon2);
			}
			
		} catch (Exception e) {
			log.error("兑换邀请码添加优惠券时出现异常   类："+this.getClass()+" addTwoCoupon", e);
			return false;
		}
		
		return true;
	}

	/**
	 * 
	 * @Title: useCouponByUser 
	 * @Description: 用户使用优惠券
	 * @param ucid 用户优惠券Id
	 * @param couponType 优惠券类型
	 * @author YHQ 
	 * @return boolean    返回类型
	 * 
	 */
	@Override
	@Transactional(propagation=Propagation.REQUIRED)
	public boolean useCouponByUser(String ucid, Integer couponType) {
		
		// 设置获取优惠券信息的查询条件
		Criterion criterion = Restrictions.eq("ucId", ucid);

		// 根据优惠券Id获取优惠券信息
		UserCoupon userCoupon = null;
		try {
			userCoupon = super.queryCriteriaUnResult(criterion);
		} catch (Exception e) {
			log.error("根据用户优惠券Id获取优惠券信息是出现异常 类：" + this.getClass(), e);
			return false;
		}

		if (userCoupon != null) {
			// 修改优惠券状态为已使用
			userCoupon.setCouponStatus(couponType);
		}
		
		return true;
	}

	
	/**
	 * @Description: 添加现金优惠券
	 * @param loginId 用户登录id
	 * @param isActive 是否要激活（true要激活  ，false 不要激活）
	 * @author fengshuonan
	 * @return boolean 
	 */
	@Override
	@Transactional(propagation=Propagation.REQUIRED)
	public boolean addMoneyCoupon(String loginId,boolean isActive) {

		UserCoupon userCoupon = new UserCoupon();
		userCoupon.setUcId(ToolUtil.getUid()); // 优惠券ID
		userCoupon.setLoginId(loginId); // 用户ID
		userCoupon.setCouponId(1); // 出行券
		userCoupon.setCouponMoney(2); // 优惠金额
		userCoupon.setCreateTime(new Date());
		userCoupon.setCouponType(2);
		userCoupon.setExpiredTime(DateFormatUtil.yyyy_MM_dd_HHmmss("2016-07-31 00:00:00"));
		
		if(isActive){
			userCoupon.setCouponStatus(2); // 优惠券状态(已激活)
		}else{
			userCoupon.setCouponStatus(1); // 优惠券状态(未激活)
		}
		
		try {
			super.save(userCoupon);
			return true;
		} catch (Exception e) {
			log.error("添加用户优惠券出现异常！", e);
		}

		return false;
	}

	/**
	 * 
	 * @Title: getExpiredCouponNumber 
	 * @Description: 获取即将过期优惠券
	 * @param userId 用户Id
	 * @author YHQ 
	 * @since V2.6.3
	 * @return ExpiredCouponDTO 过期优惠券DTO
	 * 
	 */
	@Override
	@Transactional(readOnly = true)
	public ExpiredCouponDTO getExpiredCouponNumber(String userId) {
		
		try {
			return sqlBaseDao.sqlToCustomBeanUnique(ExpiredCouponDTO.class, com.dingding.service.activity.core.sql.UserCouponSQL.GET_EXPIRED_COUPON_NUMBER, userId);
		} catch (Exception e) {
			log.error("获取即将过期优惠券时出现异常   类： " + this.getClass() + " getExpiredCouponNumber()", e);
		}
		
		return null;
	}

}
